\documentclass[12pt, a4paper]{article}

\usepackage{CJK}
\usepackage[margin=1.5cm, includefoot]{geometry}
\usepackage{indentfirst}

\begin{CJK}{UTF8}{fzst}
  \title{Linux 使用中的一些小trick}
  \author{陈如山\\chenrs@ics.neu.edu.cn}
  \date{2008年06月27日}
\end{CJK}

\begin{document}
\begin{CJK}{UTF8}{fzst}
  \maketitle
  
  \newlength{\lineIndentWidth}
  \setlength{\lineIndentWidth}{4ex}
  \newlength{\parboxWidth}
  \setlength{\parboxWidth}{13cm}
  
  \begin{enumerate}
  \item {\bf shell script 中处理命令行参数}

    例：
    \begin{quote}
      \fbox{
        \parbox{\parboxWidth}{
          argCnt=\$\#\\
          for ((i=1; i $<$= \$argCnt; ++i))\\
          \hspace*{\lineIndentWidth}do\\
          \hspace*{\lineIndentWidth}shift\\
          \hspace*{\lineIndentWidth}echo \$1\\
          done
        }
      }
    \end{quote}
    这里 shift 命令会改变 \$\# 的值。

  \item {\bf xargs 命令}

    例：
    \begin{quote}
      \fbox{
        \parbox{\parboxWidth}{
          find --regex '$\backslash$./tmp.*' $|$ xargs --i mv \{\} /tmp/
        }
      }
    \end{quote}
    这个命令会将当前目录下所有文件名以 tmp 为前缀的文件移到 /tmp/ 目录下。注意 xargs 命令中的 \{\} 会被替换成 '$|$' 之前的命令的输出，--i 选项用于开启这种替换。
    
  \item {\bf shell script 中的 mv，cp 和 if 命令注意事项}
    
    在 shell script 中使用 mv 和 cp 命令时，参数一定要在 "" 内，象这样：
    \begin{quote}
      \fbox{
        \parbox{\parboxWidth}{
          ... ...\\
          mv "\$somefile" "\$somedir"\\
          ... ...
        }
      }
    \end{quote}
    之所以这么做，是因为 \$somefile 或 \$somedir 展开后可能包含空格或 \& 这样的特殊符号。

    对于 if 命令，要比较两个包含字符串的变量时，也要将这两个变量放在 "" 中，象这样：
    \begin{quote}
      \fbox{
        \parbox{\parboxWidth}{
          ... ...\\
          if [ "\$somestr" == "str" ]; then\\
          fi\\
          ... ...
        }
      }
    \end{quote}
    之所以这么做，是因为 \$somestr 有可能是 "" ，即空字符串，如果不加 "" ，if 语言会被解析为 if [ == "str" ] ... ，这是个语法错误。

  \item {\bf sed 中 ' 和 " 的使用}

     目前有一招：
       \begin{itemize}
       \item 想在 sed 命令中匹配 ' ，就像这样：sed "s/\char94 '.*//g"（这个命令删除所有以 ' 开头的行）。
       \item 想在 sed 命令中匹配 " , 就像这样：sed 's/\char94 ".*//g'（这个命令删除所有以 " 开头的行）。
       \end{itemize}
     不过如果你想同时匹配 ' 和 " ，这招不行。用到了再说吧。

   \item {\bf diff 命令的输出格式}
     
     如下命令：
     \begin{quote}
       \fbox{
         \parbox{\parboxWidth}{
           diff from-file to-file
         }
       }
     \end{quote}

     会产生如下格式输出：
     \begin{quote}
       \fbox{
         \parbox{\parboxWidth}{
           change-command\\
           $<$ from-file-line\\
           $<$ from-file-line\\
           $<$ ... ...\\
           ---\\
           $<$ to-file-line\\
           $<$ to-file-line\\
           $<$ ... ...
         }
       }
     \end{quote}
     
     根据这个输出我们可以知道如何将 from-file 转换成 to-file。

   \item {\bf ln 的使用}
     
     ln 命令的格式是这样的：
     \begin{quote}
       \fbox{
         \parbox{\parboxWidth}{
           ln -s $<$要链接的文件$>$ $<$链接名称$>$
         }
       }
     \end{quote}
     
   \item {\bf 在 urxvt 中使用 SCIM 输入法}

     在 .Xdefaults 文件中加入如下行：
     \begin{quote}
       \fbox{
         \parbox{\parboxWidth}{
           urxvt.inputMethod: SCIM
         }
       }
     \end{quote}
     注意这里的 SCIM 一定要大写。

   \item {\bf Emacs 中配置 face}
     
     \begin{quote}
       \fbox{
         \parbox{\parboxWidth}{
           M-x customize-face RET
         }
       }
     \end{quote}

   \item {\bf 添加一个系统服务}

     执行如下步骤可以添加一个系统服务（假设服务名叫 server）：
     \begin{enumerate}
       \item 用你喜欢的编辑器编写脚本 server。
       \item chmod +x server
       \item mv server /etc/init.d/
       \item chkconfig $--$add server
     \end{enumerate}
     
   \item {\bf grub 的安装}

     执行如下步骤完成 grub 的安装：
     \begin{enumerate}
       \item 光启到 rescue mode。
       \item 以 root 登录。
       \item \# grub\\
         grub$>$ root (hd0,0)\\
         grub$>$ setup (hd0)
       \item \# reboot
     \end{enumerate}
     
   \item {\bf 使虚拟机上的 Linux 和本地 Linux 共享文件夹}
     
     执行如下步骤（假设要共享的文件夹为 \$HOME/share）：
     \begin{enumerate}
       \item 配置 samba 共享 \$HOME/share。
       \item 在虚拟机的 Linux 中调用：
         \begin{quote}
           \fbox{
             \parbox{\parboxWidth}{
               mount.cifs //本地Linux IP/share /mnt/
             }
           }
         \end{quote}
         其中 /mnt/ 是你挂载本机 share 的地方，你当然可以换。
         
     \end{enumerate}

   \item {\bf Emacs 中的中文输入法}
     \begin{quote}
       \fbox{
         \parbox{\parboxWidth}{
           C-x RET C-$\backslash$\ $<$inputmethod$>$ RET
         }
       }
     \end{quote}
  \end{enumerate}
\end{CJK}
\end{document}
